home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / lib / cups / backend / beh next >
Text File  |  2009-08-20  |  7KB  |  206 lines

  1. #!/usr/bin/perl
  2. # The above Perl path may vary on your system; fix it!!! -*- perl -*-
  3.  
  4. # beh - Backend Error Handler
  5.  
  6. # A wrapper for CUPS backends to make error handling configurable
  7.  
  8. # Usually, if a CUPS backend exits with an error status other than zero
  9. # (for example if a printer is not turned on or not reachable on the
  10. # network), CUPS disables the print queue and one can only print again
  11. # if a system administrator re-enables the queue manually. Even restarting
  12. # CUPS (or rebooting) does not re-enable disabled queues.
  13. #
  14. # For system administrators this can get annoying, for newbie users
  15. # who are not aware of this problem it looks like that CUPS is severely
  16. # broken. They remove and re-install print queues, getting on the nerves
  17. # of distro install support, people, or even switch back to a proprietary
  18. # operating system.
  19. #
  20. # This script makes the handling of such backend errors configurable, so
  21. # that the problem can easily be worked around. The new possibilities are:
  22. #
  23. #  - Let queues simply not being disabled. Simple approach, but job gets 
  24. #    lost.
  25. #
  26. #  - Repeat a given number of times.
  27. #
  28. #  - Repeat infinitely often, until the job gets finally through. This
  29. #    is the standard of LPRng, and it eliminates loss of the job.
  30. #
  31. #  - The interval between two attemts to run the backend can also be
  32. #    configured.
  33. #
  34. #  - Configuration is done independently for each print queue. So local
  35. #    printers and network printers can be treated differently.
  36.  
  37. # Save this file in your CUPS backend directory, usually
  38. # /usr/lib/cups/backend/ or /usr/local/lib/cups/backend/
  39. #
  40. # Mark this filter world-readable and world-executable. Restart CUPS to
  41. # make the new backend known to the spooler.
  42. #
  43. # See http://www.openprinting.org/cups-doc.html and the additional
  44. # instructions below.
  45.  
  46. # beh - Backend Error Handler
  47. #
  48. # Copyright 2005 Till Kamppeter <till.kamppeter@gmail.com>
  49. #
  50. #  This program is free software; you can redistribute it and/or modify it
  51. #  under the terms of the GNU General Public License as published by the
  52. #  Free Software Foundation; either version 2 of the License, or (at your
  53. #  option) any later version.
  54. #
  55. #  This program is distributed in the hope that it will be useful, but
  56. #  WITHOUT ANY WARRANTY; without even the implied warranty of
  57. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
  58. #  Public License for more details.
  59. #
  60. #  You should have received a copy of the GNU General Public License
  61. #  along with this program; if not, write to the Free Software
  62. #  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  63. #  USA.
  64.  
  65. # Usage: 
  66. #
  67. # cp beh /usr/lib/cups/backend/
  68. # chmod 755 /usr/lib/cups/backend/beh
  69. # killall -HUP cupsd (or "/etc/init.d/cups restart")
  70. # lpadmin -p <queue name> -E -v beh:/<dd>/<att>/<delay>/<originaluri>
  71. #
  72. # with 
  73. #   <queue name>:     The name of your print queue
  74. #   <dd>:             Don't Disable, if "1", beh always exits with zero
  75. #                     status, so the queue gets never disabled when the
  76. #                     original backend exits with an error. "0" carries
  77. #                     the error status of the last call of the backend
  78. #                     (after <att> retries) on to CUPS, so the queue
  79. #                     usually gets disabled.
  80. #   <att>:            Attempts, number of attempts to recall the backend
  81. #                     in case of an error. "0" means infinite retries. In
  82. #                     this case <dd> gets meaningless.
  83. #   <delay>:          Delay between two attempts to call the beckend, to
  84. #                     be given in seconds and as an integer number.
  85. #                     Meaningless if <att> is one.
  86. #   <originaluri>:    The original URI, which your queue had before.
  87. #
  88. # All parameters, especially, <dd>, <att>, and <delay> have always to
  89. # be specified, even if one of them is meaningless due to the setting of
  90. # the others.
  91. #
  92. # beh works with every backend except the "hp" backend of HPLIP.
  93. #
  94. # Example URIs:
  95. #
  96. # beh:/1/3/5/socket://printer:9100
  97. #
  98. #   On the network printer with host name "printer" it is tried to access
  99. #   3 times with 5 second delays between the attempts. If the job still
  100. #   fails, the queue is not disabled (and the job discarded).
  101. #
  102. # beh:/0/10/60/socket://printer:9100
  103. #
  104. #   Retry 10 times in one minute intervals, disable the queue when still
  105. #   not succeeding.
  106. #
  107. # beh:/1/0/60/usb://Brother/HL-5040%20series
  108. #
  109. #   On a Brother HL-5040 on the USB try infinitely often until the printer
  110. #   comes back, in intervals of one minute. This way the job does not get
  111. #   lost when the printer is turned off and one can intendedly delay
  112. #   printing by simply switching off the printer. The ideal configuration
  113. #   for desktop printers and/or home users.
  114.  
  115. # Acknowledgement
  116. # Thanks to Jeff Hardy (hardyjm at potsdam dot edu) for writing the
  117. # "accsnmp" wrapper backend (http://fritz.potsdam.edu/projects/cupsapps/). 
  118. # This backend showed me the trick how to write a universal wrapper 
  119. # backend in a scripting language.
  120.  
  121. use strict;
  122.  
  123. $0 =~ m!^(.*)/([^/]+)\s*$!;
  124. my $progname = ($2 || $0);
  125. my $progpath = ($1 || "/usr/lib/cups/backend");
  126.  
  127. if (!$ARGV[0]){
  128.     print "network $progname \"Unknown\" \"Backend Error Handler\"\n";
  129.     exit 0;
  130. }
  131.  
  132. if (scalar(@ARGV) < 5 || scalar(@ARGV) > 6){
  133.     print STDERR "ERROR: Usage: $progname job-id user title copies options [file]\n";
  134.     exit 1;
  135. }
  136.  
  137. my ($jobID, $userName, $jobTitle, $copies, $printOptions, $printFile) = 
  138.     @ARGV;
  139.  
  140. my $tempFile;
  141. if (!$printFile) { 
  142.  
  143.     my $jid = $jobID;
  144.     my $uid = $userName;
  145.     $jid =~ s/\W//g; #sanity check
  146.     $uid =~ s/\W//g; #sanity check
  147.     my $tmpDir = $ENV{TMPDIR};
  148.     $tmpDir ||= "/tmp";
  149.     $tempFile = "$tmpDir/$jid-$uid-cupsjob$$";
  150.  
  151.     open (OUT, ">$tempFile") or die "ERROR: Cannot write $tempFile: $!\n";
  152.  
  153.     while(<STDIN>){
  154.     print OUT "$_";
  155.     }
  156.  
  157.     close OUT;
  158.  
  159.     $printFile = $tempFile;
  160.  
  161.     # Backends should only produce multiple copies if a file name is 
  162.     # supplied (see CUPS Software Programmers Manual)
  163.     $copies = 1;
  164.  
  165. }
  166.  
  167. my $uri = $ENV{DEVICE_URI};
  168. $uri =~ m!^$progname:/(\d+)/(\d+)/(\d+)/(\S+)$! or
  169.     die "URI must be \"beh:/<dd>/<att>/<delay>/<original uri>\"!\n";
  170. my $dontdisable = $1;
  171. my $attempts = $2;
  172. my $delay = $3;
  173. $uri = $4;
  174. $uri =~ m!^([^:\s]+):!;
  175. my $backend = $1;
  176. $ENV{DEVICE_URI} = $uri;
  177.  
  178. # Control by "lpr" command line options, commented out for security
  179. # reasons (user could intendedly make queues being disabled)
  180.  
  181. #$printOptions =~ m/\bBackendErrorDisableQueue=(\S*)\b/ && 
  182. #    ($dontdisable = ($1 =~ /no/i ? 1 : 0));
  183. #$printOptions =~ m/\bBackendErrorRetries=(\S*)\b/ && ($attempts = $1);
  184. #$printOptions =~ m/\bBackendErrorRetryDelay=(\S*)\b/ && ($delay = $1);
  185. #$printOptions =~ m/\bBackendErrorRetryForever=(\S*)\b/ &&
  186. #    ($delay = ($1 =~ /yes/i ? 0 : $delay));
  187.  
  188. my $exitvalue;
  189. while($exitvalue = (($uri !~ m!^file:(.*)$!) && ($uri !~ m!^(/.*)$!) ?
  190.             system {"$progpath/$backend"}
  191.             ($uri, $jobID, $userName, $jobTitle, $copies,
  192.              $printOptions, $printFile) :
  193.             system ("cat $printFile > $1")) >> 8) {
  194.     if ($attempts > 0) {
  195.     $attempts --;
  196.     last if $attempts == 0;
  197.     }
  198.     sleep $delay if $delay > 0;
  199. }
  200.  
  201. unlink $tempFile if $tempFile;
  202.  
  203. $exitvalue = 0 if $dontdisable;
  204. exit $exitvalue;
  205.